package ia.util;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.PriorityQueue;

import javax.swing.ImageIcon;

public class LectorImagenes {

	private Image Imagen;
	private int rgb;

	public LectorImagenes() {
	}

	public Image getImagen() {
		return Imagen;
	}

	public int getRgb() {
		return rgb;
	}

	public void setImagen(Image imagen) {
		Imagen = imagen;
	}

	public void setRgb(int rgb) {
		this.rgb = rgb;
	}

	public int[][] getMapaRGB(String ruta) {
		// Tomamos una imagen del directorio principal
		Imagen = new ImageIcon(ruta).getImage();

		// Convertimos la imagen a BufferredImage
		BufferedImage bImage = toBufferedImage(Imagen);

		// Leemos el ancho y alto de la imagen
		int width = bImage.getWidth();
		int height = bImage.getHeight();

		int mapa[][] = new int[width][height];

		for (int i = 0; i < width; i++)
			for (int j = 0; j < height; j++)
				mapa[i][j] = bImage.getRGB(i, j);
		return mapa;
	}

	public BufferedImage toBufferedImage(Image image) {
		/* miramos que la imagen no sea ya una instancia de BufferedImage */
		if (image instanceof BufferedImage) {
			return ((BufferedImage) image);
		} else {
			/* nos aseguramos que la imagen esta totalmente cargada */
			image = new ImageIcon(image).getImage();
			/* creamos la nueva imagen */
			BufferedImage bufferedImage = new BufferedImage(
					image.getWidth(null), image.getHeight(null),
					BufferedImage.TYPE_INT_ARGB);
			Graphics g = bufferedImage.createGraphics();
			g.drawImage(image, 0, 0, null);
			g.dispose();
			return bufferedImage;
		}
	}

	public int[][] getMapaGS(String ruta) {
		/* Tomamos el mapa en rgb */
		int[][] mapa = getMapaRGB(ruta);
		int red, green, blue;
		PriorityQueue<Integer> ng=new PriorityQueue<Integer>();
		/* Convertimos el mapa a RGB */
		for (int i = 0; i < Imagen.getWidth(null); i++)
			for (int j = 0; j < Imagen.getHeight(null); j++) {
				red = (mapa[i][j] >> 16) & 0xff;
				green = (mapa[i][j] >> 8) & 0xff;
				blue = (mapa[i][j]) & 0xff;
				
				/* Incorporamos los niveles de gris que habra en RGB */
				if (!ng.contains(red)) ng.add(red);
				mapa[i][j]=red;
			}
		
		/* Parametrizamos los niveles de gris */
		int niveles[]=new int[15], i=14, k=0;
		while (!ng.isEmpty())
			niveles[i--]=ng.poll();
		
		/* A cada color del mapa se le asigna su nivel de gris correspondiente */
		for (i = 0; i < Imagen.getWidth(null); i++)
			for (int j = 0; j < Imagen.getHeight(null); j++) {
				while(k<15 && niveles[k++]!=mapa[i][j]);
				mapa[i][j]=k-1;
				k=0;
			}		
		return mapa;
	}

	/* Imprime el pixel en ARGB */
	public void printPixelARGB(int pixel) {
		int alpha = (pixel >> 24) & 0xff;
		int red = (pixel >> 16) & 0xff;
		int green = (pixel >> 8) & 0xff;
		int blue = (pixel) & 0xff;
		System.out.println("argb: " + alpha + ", " + red + ", " + green + ", "
				+ blue);
	}
}
